package com.san.metadata.service;

import java.util.List;

import com.san.common.utils.PageUtils;
import com.san.common.utils.Query;
import com.san.metadata.domain.ColumnDTO;
import com.san.metadata.domain.DataSourceDO;
import com.san.metadata.domain.TableDTO;
import com.san.metadata.domain.TechnicalColumnsDO;
import com.san.metadata.domain.TechnicalTableDO;
import com.san.metadata.vo.TechnicalColumnsVO;

/**
 * 技术元数据服务类
 * 
 * @author hulp
 *
 */
public interface TechnicalMetadataService {

	/**
	 * 查询技术元数据
	 * 
	 * @param query
	 * @return
	 */
	PageUtils list(Query query) throws Exception;

	/**
	 * 获取所有技术元数据表
	 * 
	 * @param query
	 * @return
	 */
	List<TableDTO> listTechnicalTable() throws Exception;

	/**
	 * 根据导入类型获取技术元数据表
	 * 
	 * @param query
	 * @return
	 */
	List<TechnicalTableDO> allTechnicalTable(Query query) throws Exception;

	/**
	 * 获取指定技术元数据表字段
	 * 
	 * @param tableId 技术元数据表ID
	 * @return
	 * @throws Exception
	 */
	List<TechnicalColumnsDO> allTechnicalColumns(Long tableId) throws Exception;

	/**
	 * 获取指定技术元数据表字段
	 * 
	 * @param tableId 技术元数据表ID
	 * @return
	 * @throws Exception
	 */
	List<ColumnDTO> listTechnicalColumns(Long tableId) throws Exception;

	/**
	 * 保存技术元数据
	 * 
	 * @param technicalTableDO
	 * @return
	 * @throws Exception
	 */
	int save(TechnicalTableDO technicalTableDO) throws Exception;

	/**
	 * 更新技术元数据
	 * 
	 * @param technicalTableDO
	 * @return
	 * @throws Exception
	 */
	int doEdit(TechnicalTableDO technicalTableDO) throws Exception;

	/**
	 * 删除技术元数据
	 * 
	 * @param tableId 技术元数据表ID
	 * @return
	 * @throws Exception
	 */
	int remove(Long tableId) throws Exception;

	/**
	 * 批量删除技术元数据
	 * 
	 * @param tableIds 技术元数据表ID集合
	 * @return
	 * @throws Exception
	 */
	int batchRemove(Long[] tableIds) throws Exception;

	/**
	 * 获取单条技术元数据
	 * 
	 * @param tableId 技术元数据表ID
	 * @return
	 * @throws Exception
	 */
	TechnicalTableDO getById(Long tableId) throws Exception;

	/**
	 * 获取数据源下的所有表
	 * 
	 * @param query
	 * @return
	 * @throws Exception
	 */
	PageUtils listSourceTable(DataSourceDO dataSourceDO) throws Exception;

	/**
	 * 获取目标表中的所有字段信息
	 * 
	 * @param dataSourceDO     数据源
	 * @param technicalTableDO 技术元数据
	 * @return
	 * @throws Exception
	 */
	PageUtils listColumns(DataSourceDO dataSourceDO, TechnicalTableDO technicalTableDO) throws Exception;

	/**
	 * 保存字段信息
	 * 
	 * @param technicalColumnsVO 技术元数据字段信息
	 * @return
	 * @throws Exception
	 */
	int saveColumn(TechnicalColumnsVO technicalColumnsVO) throws Exception;

	/**
	 * 创建技术元数据表
	 * 
	 * @param sourceType             数据源类型
	 * @param tableId                技术元数据表ID
	 * @param targetDataSourceDO     目标源数据
	 * @param technicalColumnsVOList 技术元数据字段信息List
	 * @return
	 * @throws Exception
	 */
	boolean saveTable(int sourceType, Long tableId, DataSourceDO targetDataSourceDO,
			List<TechnicalColumnsVO> technicalColumnsVOList);

	/**
	 * 批量修改技术元数据字段标记
	 * 
	 * @param technicalColumnsVOList 技术元数据字段信息List
	 * @return
	 */
	int batchColumnsUpdate(List<TechnicalColumnsVO> technicalColumnsVOList);

}
